gl: Fix implicit leaking of shader object
authorxndcn <xndchn@gmail.com>
Tue, 29 Dec 2020 14:29:37 +0000 (22:29 +0800)
committerxndcn <xndchn@gmail.com>
Tue, 29 Dec 2020 15:50:45 +0000 (23:50 +0800)
According to OpenGL spec, a shader object will only be flagged
for deletion unless it has been detached; when a program object
is deleted, those shader objects attached to it will be detached
but not deleted unless they have already been flagged for deletion.

So we shall detach a shader object before it is deleted, and delete
it before the program object is deleted best.

demos/gtk-demo/gtkgears.c
gdk/gdkgl.c
gsk/gl/gskglshaderbuilder.c
tests/gtkgears.c

index ba52ddd1b0a5c963c7425c05dea53876864228b0..1463cbb6b5ed97dda96023c47ec344e60f8934e1 100644 (file)
@@ -787,6 +787,8 @@ gtk_gears_realize (GtkWidget *widget)
   glLinkProgram(program);
   glGetProgramInfoLog(program, sizeof msg, NULL, msg);
   g_debug ("program info: %s\n", msg);
+  glDetachShader (program, v);
+  glDetachShader (program, f);
   glDeleteShader (v);
   glDeleteShader (f);
 
index 56dce183332c45e6b23d0db2d0fba602c18086bf..5ebd2138d8a690bd8fc5c8004ee2e76b4116f55a 100644 (file)
@@ -107,6 +107,9 @@ make_program (GdkGLContextProgram *program,
 
   glLinkProgram (program->program);
 
+  glDetachShader (program->program, vertex_shader);
+  glDetachShader (program->program, fragment_shader);
+
   glDeleteShader (vertex_shader);
   glDeleteShader (fragment_shader);
 
index 1a4ddc301b93ce7151fb0289784cbd1fd85111d4..75aef60e7d659de5c0b322b69a117f039eea614b 100644 (file)
@@ -232,6 +232,8 @@ gsk_gl_shader_builder_create_program (GskGLShaderBuilder  *self,
   glBindAttribLocation (program_id, 0, "aPosition");
   glBindAttribLocation (program_id, 1, "vUv");
   glLinkProgram (program_id);
+  glDetachShader (program_id, vertex_id);
+  glDetachShader (program_id, fragment_id);
 
   glGetProgramiv (program_id, GL_LINK_STATUS, &status);
   if (status == GL_FALSE)
@@ -252,14 +254,9 @@ gsk_gl_shader_builder_create_program (GskGLShaderBuilder  *self,
 
       glDeleteProgram (program_id);
       program_id = -1;
-
-      goto out;
     }
 
-  glDetachShader (program_id, vertex_id);
   glDeleteShader (vertex_id);
-
-  glDetachShader (program_id, fragment_id);
   glDeleteShader (fragment_id);
 
 out:
index 5f5686c883205cca9aad2a11eaf19a3b3053aa49..2ece67dcf9ee7d2547f66934f0fefd832ad8c5ca 100644 (file)
@@ -787,6 +787,8 @@ gtk_gears_realize (GtkWidget *widget)
   glLinkProgram(program);
   glGetProgramInfoLog(program, sizeof msg, NULL, msg);
   g_print ("program info: %s\n", msg);
+  glDetachShader (program, v);
+  glDetachShader (program, f);
   glDeleteShader (v);
   glDeleteShader (f);